From a7c6b15049c42bfd45b2384a57b047d2f605e7ec Mon Sep 17 00:00:00 2001 From: Xudong Hao Date: Wed, 25 Apr 2012 11:18:45 +0100 Subject: [PATCH] libxl: passthrough: avoid passing through devices not owned by pciback This patch makes sure the passthrough device belongs to pciback before allow them passthrough to the guest. There are still many other checks missing. xm terminates the guest startup process when this type of condition is found. This patch just allows the guest to continue to boot but with no device passthrough. Signed-off-by: Allen Kay Signed-off-by: Xudong Hao Acked-by: Ian Jackson Committed-by: Ian Jackson --- tools/libxl/libxl_pci.c | 25 +++++++++++++++++++++++++ 1 file changed, 25 insertions(+) diff --git a/tools/libxl/libxl_pci.c b/tools/libxl/libxl_pci.c index e8b8839847..3856bd99e7 100644 --- a/tools/libxl/libxl_pci.c +++ b/tools/libxl/libxl_pci.c @@ -664,6 +664,24 @@ int libxl_device_pci_add(libxl_ctx *ctx, uint32_t domid, libxl_device_pci *pcide return rc; } +static int libxl_pcidev_assignable(libxl_ctx *ctx, libxl_device_pci *pcidev) +{ + libxl_device_pci *pcidevs; + int num, i; + + pcidevs = libxl_device_pci_list_assignable(ctx, &num); + for (i = 0; i < num; i++) { + if (pcidevs[i].domain == pcidev->domain && + pcidevs[i].bus == pcidev->bus && + pcidevs[i].dev == pcidev->dev && + pcidevs[i].func == pcidev->func) + { + return 1; + } + } + return 0; +} + int libxl__device_pci_add(libxl__gc *gc, uint32_t domid, libxl_device_pci *pcidev, int starting) { libxl_ctx *ctx = libxl__gc_owner(gc); @@ -675,6 +693,13 @@ int libxl__device_pci_add(libxl__gc *gc, uint32_t domid, libxl_device_pci *pcide rc = libxl__device_pci_setdefault(gc, pcidev); if (rc) goto out; + if (!libxl_pcidev_assignable(ctx, pcidev)) { + LIBXL__LOG(ctx, LIBXL__LOG_ERROR, "PCI device %x:%x:%x.%x is not assignable", + pcidev->domain, pcidev->bus, pcidev->dev, pcidev->func); + rc = ERROR_FAIL; + goto out; + } + rc = get_all_assigned_devices(gc, &assigned, &num_assigned); if ( rc ) { LIBXL__LOG(ctx, LIBXL__LOG_ERROR, "cannot determine if device is assigned, refusing to continue"); -- 2.30.2